#include <iostream>
//
// Created by Asus on 2025/6/1.
//
using namespace std;

//1. 如果某个位置参数有默认值，那么从这个位置往后，从左向右，必须都要有默认值
//2. 如果函数声明有默认值，函数实现的时候就不能有默认参数
int func(int a , int b = 1, int c = 1) {
    return a + b + c;
};

int func2(int a = 10 , int b = 10, int c = 10) {
    return a + b + c;
}


void demo01() {
    cout << "ret = " << func2(20, 20, 20) << endl;
    cout << "ret = " << func(100) << endl;
}

//函数占位参数 ，占位参数也可以有默认参数
void func3(int a, int ) {
    cout << "func" << endl;
}

void demo02() {
    func3(10, 10);//占位参数必须填补
}

//函数重载需要函数都在同一个作用域下
void func1_1() {
    cout << "func1_1" << endl;
}

void func1_1(int a) {
    cout << "func1_1(int)" << endl;
}

void func1_1(double a) {
    cout << "func1_1(double)" << endl;
}

void func1_1(double a ,int b)
{
    cout << "func1_1 (double a ,int b)" << endl;
}
//函数返回值不可以作为函数重载条件
//int func1_1(double a, int b)
//{
//	cout << "func (double a ,int b)的调用！" << endl;
//}

void demo03() {
    func1_1();
    func1_1(10);
    func1_1(3.14);
    func1_1(10,3.14);
    func1_1(3.14 , 10);
}

//函数重载注意事项
//1、引用作为重载条件
void func1_2(int &a) {
    cout << "func1_2(int &a)" << endl;
}
void func1_2(const int &a)
{
	cout << "func1_2 (const int &a) " << endl;
}

//2、函数重载碰到函数默认参数
void func2_1(int a, int b = 10)
{
    cout << "func2_1(int a, int b = 10) 调用" << endl;
}

void func2_1(int a)
{
    cout << "func2_1(int a) 调用" << endl;
}

void demo04() {
    int a = 10;
    func1_2(a); //调用无const
    func1_2(10);//调用有const
    // func2_1(10); //碰到默认参数产生歧义，需要避免
}

int main(int argc, char *argv[]) {
    // demo01();
    // demo02();
    // demo03();
    demo04();
    return 0;
}
